﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.ComponentModel;
using Noris.Schedule.Support.Core;

namespace Noris.Schedule.Support
{
	/// <summary>
	/// Třída určená pro odesílání zpráv pomocí emailu
	/// </summary>
	public class MailAdapter
	{
		/// <summary>
		/// Odešle mailovou zprávu v synchronním režimu.
		/// Uživateli na závěr ohlásí výsledek: OK / Chyba
		/// </summary>
		/// <param name="to"></param>
		/// <param name="subject"></param>
		/// <param name="body"></param>
		/// <param name="notification">Informace pro uživatele, typicky důvod zprávy, například: "Informace o chybě", "Přehled aktivit programu", ...</param>
		public static void SendMailWithUserNotification(string to, string subject, string body, string notification)
		{
			_SendMail(Steward.NorisConfig.SmtpServer, Steward.NorisConfig.WfEmailAccountAdress, Steward.NorisConfig.WfEmailReplyToAdress, GetMailAdress(to, to), subject, body, notification);
		}
		/// <summary>
		/// Odešle mailovou zprávu v synchronním režimu.
		/// Uživateli na závěr ohlásí výsledek: OK / Chyba
		/// </summary>
		/// <param name="host"></param>
		/// <param name="from"></param>
		/// <param name="to"></param>
		/// <param name="subject"></param>
		/// <param name="body"></param>
		/// <param name="notification">Informace pro uživatele, typicky důvod zprávy, například: "Informace o chybě", "Přehled aktivit programu", ...</param>
		public static void SendMailWithUserNotification(string host, string from, string to, string subject, string body, string notification)
		{
			_SendMail(host, GetMailAdress(from, from), null, GetMailAdress(to, to), body, subject, notification);
		}
		/// <summary>
		/// Odešle mailovou zprávu v synchronním režimu.
		/// Uživateli na závěr ohlásí výsledek: OK / Chyba
		/// </summary>
		/// <param name="to"></param>
		/// <param name="subject"></param>
		/// <param name="body"></param>
		public static void SendMail(string to, string subject, string body)
		{
			_SendMail(Steward.NorisConfig.SmtpServer, Steward.NorisConfig.WfEmailAccountAdress, Steward.NorisConfig.WfEmailReplyToAdress,  GetMailAdress(to, to), subject, body, null);
		}
		/// <summary>
		/// Odešle mailovou zprávu v synchronním režimu.
		/// Případné chyby lze odchytit.
		/// </summary>
		/// <param name="host"></param>
		/// <param name="from"></param>
		/// <param name="to"></param>
		/// <param name="subject"></param>
		/// <param name="body"></param>
		public static void SendMail(string host, string from, string to, string subject, string body)
		{
			_SendMail(host, GetMailAdress(from, from), null, GetMailAdress(to, to), body, subject, null);
		}
		/// <summary>
		/// Odešle emailovou zprávu
		/// </summary>
		/// <param name="host"></param>
		/// <param name="from"></param>
		/// <param name="to"></param>
		/// <param name="subject"></param>
		/// <param name="body"></param>
		/// <param name="notification"></param>
		private static void _SendMail(string host, MailAddress from, MailAddress replyTo, MailAddress to, string subject, string body, string notification)
		{
			if (String.IsNullOrEmpty(host)) Throw.AplError(MessageInfo.Get("Není zadán mailový účet."));
			if (from == null) Throw.AplError(MessageInfo.Get("Není zadána adresa odesilatele."));
			if (to == null) Throw.AplError(MessageInfo.Get("Není zadána adresa příjemce."));

			MailMessage msg = new System.Net.Mail.MailMessage();
			msg.From = from;
			if (replyTo != null)
				msg.ReplyTo = replyTo;
			msg.To.Add(to);
			msg.Subject = subject;
			msg.Body = body;
			msg.IsBodyHtml = false;

			SmtpClient smtp = new SmtpClient(host);
			smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
			smtp.UseDefaultCredentials = true;

			if (notification == null)
			{
				smtp.Send(msg);
			}
			else
			{
				string errMsg = null;
				try
				{
					smtp.Send(msg);
				}
				catch (System.Net.Mail.SmtpFailedRecipientsException exc)
				{
					errMsg = exc.Message;
				}
				catch (System.Net.Mail.SmtpException exc)
				{
					errMsg = exc.Message;
				}
				catch (System.ObjectDisposedException exc)
				{
					errMsg = exc.Message;
				}
				catch (System.InvalidOperationException exc)
				{
					errMsg = exc.Message;
				}
				catch (System.ArgumentNullException exc)
				{
					errMsg = exc.Message;
				}
				catch (System.ArgumentOutOfRangeException exc)
				{
					errMsg = exc.Message;
				}
				catch (AplException exc)
				{
					errMsg = exc.Message;
				}

				if (errMsg != null)
					Dialog.ShowWarning(MessageInfo.Get("Při odesílání e-mailu «%0» došlo k chybě: %1.", notification, errMsg));
				else
					Dialog.ShowInfo(MessageInfo.Get("Odeslání e-mailu «%0» bylo úspěšně dokončeno.", notification));
			}
		}
		/// <summary>
		/// Vrátí MailAdress z daného účtu a názvu
		/// </summary>
		/// <param name="emailAccount"></param>
		/// <param name="emailAccountName"></param>
		/// <returns></returns>
		public static System.Net.Mail.MailAddress GetMailAdress(string emailAccount, string emailAccountName)
		{
			if (String.IsNullOrEmpty(emailAccount)) return null;
			return new System.Net.Mail.MailAddress(emailAccount, (String.IsNullOrEmpty(emailAccountName) ? emailAccount : emailAccountName));
		}
	}
}
